请教Java Filter过滤器 跳转页面中页面的跳转问题

请教Java Filter过滤器中页面的跳转问题_百度知道
请教Java Filter过滤器中页面的跳转问题
我有更好的答案
写一个过滤类,然后在web.xml里配置一下。网上多得是,随便一搜就可以了。。。
其他类似问题
为您推荐:
过滤器的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Filter过滤器原理跟登录实现 - Java相关当前位置:& &&&Filter过滤器原理跟登录实现Filter过滤器原理跟登录实现&&网友分享于:&&浏览:0次Filter过滤器原理和登录实现Filter过滤器API
&&&& Servlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口、FilterChain接口和FilterConfig接口。
Filter接口(源码)
public interface Filter {
public void init(FilterConfig filterConfig) throws ;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws , ServletE
public void destroy();
所有的过滤器都必须实现Filter接口。该接口定义了init,doFilter0,destory()三个方法:
&&(1)init(FilterConfig filterConfig)&&&&& 在web应用程序启动时,web服务器将根据 web.xml文件中的配置信息来创建每个注册的Filter实例对象,并将其保存在服务器的内存中。Web容器创建Filter对象实例后,将立即调用该Filter对象的init方法。Init方法在Filter生命周期中仅执行一次,web容器在调用init方法时,会传递一个包含Filter的配置和运行环境的FilterConfig对象(FilterConfig的用法和ServletConfig类似)。利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。
&&(2)doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
&&&&& doFilter()方法类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的 doFilter()方法。其中参数 request, response 为 web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;参数 chain 为代表当前 Filter 链的对象,在特定的操作完成后,可以在当前 Filter 对象的 doFilter 方法内部需要调用 FilterChain 对象的 chain.doFilter(request,response)方法才能把请求交付给 Filter 链中的下一个 Filter 或者目标 Servlet 程序去处理,也可以直接向客户端返回响应信息,或者利用RequestDispatcher的forward()和include()方法,以及 HttpServletResponse的sendRedirect()方法将请求转向到其他资源。这个方法的请求和响应参数的类型是 ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。
&(3)public&void&destroy()
&&&&&& 在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
FilterChain接口(源码)
public interface FilterChain {
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletE
(1)doFilter(ServletRequest&request,ServletResponse&response)
&&&&&&此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤& 器,如果是最后一个过滤器,则下一个就调用目标资源。
FilterConfig接口(源码)& FilterConfig接口检索过滤器名、初始化参数以及活动的Servlet上下文。
public interface FilterConfig {
//返回web.xml部署文件中定义的该过滤器的名称
public String getFilterName();
//返回调用者所处的servlet上下文
public ServletContext getServletContext();
//返回过滤器初始化参数值的字符串形式,当参数不存在时,返回nul1.name是初始化参数名
public String getInitParameter(String name);
//以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回为空
public Enumeration getInitParameterNames();
了解了Filter的基本概念和源码,下面具体使用下Filter过滤器来实现登录过滤。
需求:访问A页面(登录后才能访问的页面)--&未登录--&跳转到登录页面--&登陆成功后,跳转到A页面
自定义HttpFilter
import javax.servlet.F
import javax.servlet.FilterC
import javax.servlet.FilterC
import javax.servlet.ServletR
import javax.servlet.ServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
* HttpFilter
public abstract class HttpFilter implements Filter{
//保存filterConfig对象
private FilterConfig filterC
* 直接返回filterConfig对象
public FilterConfig getFilterConfig() {
return filterC
* 不建议子类直接覆盖,若直接失败,将可能导致filterConfig成员变量初始化失败
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterC
* 供子类继承的初始化方法,刻通过getFilterConfig()方法获得filterConfig对象
private void init() {}
* 原生的doFilter方法,在方法内部把ServletRequest和ServletResponse转化化为了HttpServletRequest和HttpServletResponse,
* 并调用了doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain)方法
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)
HttpServletResponse response = (HttpServletResponse)
doFilter(request, response, filterChain);
* 抽象方法,为http请求定制,必须实现的方法
* @param request
* @param response
* @param filterChain
* @throws IOException
* @throws ServletException
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws IOException, ServletE
public void destroy() {}
web.xml配置CommonFilter
&filter-name&commonFilter&/filter-name&
&filter-class&com.gcx.monFilter&/filter-class&
&filter-mapping&
&filter-name&commonFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
登录过滤器CommonFilter
import java.io.IOE
import javax.servlet.FilterC
import javax.servlet.ServletE
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.slf4j.L
import org.slf4j.LoggerF
public class CommonFilter extends HttpFilter {
private final Logger log = LoggerFactory.getLogger(CommonFilter.class);
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
("==============拦截get请求================");
if ("GET".equalsIgnoreCase(request.getMethod())) {
RequestUtil.saveRequest(request);
String requestUri = request.getRequestURI();
String contextPath = request.getContextPath();
String url = requestUri.substring(contextPath.length());
if ("/login".equals(url)) {
filterChain.doFilter(request, response);
String username = (String) request.getSession().getAttribute("user");
if (username == null) {
("被拦截:跳转到login页面!");
request.getRequestDispatcher("/page/index1.jsp").forward(request, response);
filterChain.doFilter(request, response);
RequestUtil 保存、获取request并加密请求页面
public class RequestUtil {
logger = LoggerFactory.getLogger(RequestUtil.class);
base64 = new Base64(true);
LAST_PAGE = "lastPage";//未登录时访问的页面
REDIRECT_HOME = "/";//未登录时跳转到首页
LOGIN_HOME = "/index.jsp";//登录成功后进入的页面
* 保存当前请求
public static void saveRequest(HttpServletRequest request) {
request.getSession().setAttribute(LAST_PAGE, RequestUtil.hashRequestPage(request));
logger.debug("被拦截的url的sessionID:{}", request.getSession().getId());
logger.debug("save request for {}", request.getRequestURI());
* 加密请求页面
* @param request
public static
String hashRequestPage(HttpServletRequest request) {
String reqUri = request.getRequestURI();
String query = request.getQueryString();
if (query != null) {
reqUri += "?" +
String targetPage = null;
targetPage = base64.encodeAsString(reqUri.getBytes("UTF-8"));
} catch (Unsupported ex) {
//this does not happen
return targetP
* 取出之前保存的请求
public static String retrieveSavedRequest(HttpServletRequest request) {
HttpSession session = request.getSession();
if (session == null) {
return REDIRECT_HOME;
String HashedlastPage = (String) session.getAttribute(LAST_PAGE);
if (HashedlastPage == null) {
return LOGIN_HOME;
return retrieve(HashedlastPage);
* 解密请求的页面
* @param targetPage
public static String retrieve(String targetPage) {
byte[] decode = base64.decode(targetPage);
String requestUri = new String(decode, "UTF-8");
int i = requestUri.indexOf("/", 1);
return requestUri.substring(i);
} catch (UnsupportedEncodingException ex) {
//this does not happen
return null;
LoginCOntroller
@RequestMapping(value = "/hello",method = RequestMethod.GET)&&&&
public String testHello( String test) {&&&&&&&&
("执行了Hello方法!");&&&&&&&&
return "loginSuccess";&&&&
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(HttpServletRequest request,String userName,String password){
("执行了login方法!");
password = DigestUtils.md5Hex(password);
User user = userService.findUser(userName,password);
if(user!=null){
request.getSession().setAttribute("userId", user.getId());
request.getSession().setAttribute("user", userName);
return "redirect:" + RequestUtil.retrieveSavedRequest(request);//跳转至访问页面
("用户不存在");
request.getSession().setAttribute("message", "用户名不存在,请重新登录");
return "index";
最后需要几个jsp页面login.jsp,index.jsp(首页面,任何人都能访问的),loginSuccess.jsp,还需要在controller中加上一个测试testHello方法用于满足之前说的需求。
注意事项:我们过滤的是所有请求,但对于静态资源css,js,image我们应该不拦截,对其放行。我们可以在web.xml中进行指定
&!-- 不拦截静态文件 --&
&servlet-mapping&
&servlet-name&default&/servlet-name&
&url-pattern&/js/*&/url-pattern&
&url-pattern&/css/*&/url-pattern&
&url-pattern&/image/*&/url-pattern&
&url-pattern&/fonts/*&/url-pattern&
&/servlet-mapping&
写在后面:本来想把Filter和SpringMVC的interceptor拦截器一起写总结了,但感觉篇幅有些长打算下篇在介绍。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有使用filter使session失效的用户,重新跳转到登录页面(转)
使用filter使session失效的用户,重新跳转到登录页面:&
1.前台简单的登录测试页面login.jsp&
&%@&page&language="java"&import="java.util.*"&pageEncoding="UTF-8"%&&&
String&path&=&request.getContextPath();&&
String&basePath&=&request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";&&
&!DOCTYPE&HTML&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"&&&
&&&head&&&
&&&&&base&href="&%=basePath%&"&&&
&&&&&title&My&JSP&'login.jsp'&starting&page&/title&&&
&&&&&meta&http-equiv="pragma"&content="no-cache"&&&
&&&&&meta&http-equiv="cache-control"&content="no-cache"&&&
&&&&&meta&http-equiv="expires"&content="0"&&&&&&&
&&&&&meta&http-equiv="keywords"&content="keyword1,keyword2,keyword3"&&&
&&&&&meta&http-equiv="description"&content="This&is&my&page"&&&
&&&&&!--&&
&&&&&link&rel="stylesheet"&type="text/css"&href="styles.css"&&&
&&&&&script&type="text/javascript"&&&
&&&&&&&function&submitForm(){&&
&&&&&&&&&&document.getElementByIdx_x_x_x_x_x("form1").submit();&&&
&&&&&&&}&&
&&&&&/script&&&
&&&/head&&&
&&&body&&&
&&&&This&is&Login&page.&&br&&&
&&&&&form&action="login"&method="post"&id="form1"&name="form1"&&&
&&&&&&&UserName:&input&type="text"&id="userName"&name="userName"/&&input&type="button"&value="submit"&onclick="submitForm()"&id="submit1"&/&&&
&&&&&/form&&&
&&&/body&&&
2.struts.xml的配置信息:&
&?xml&version="1.0"&encoding="UTF-8"?&&&
&!DOCTYPE&struts&PUBLIC&&&&
&&&&&"-//Apache&Software&Foundation//DTD&Struts&Configuration&2.1//EN"&&&&
&&&&"http://struts.apache.org/dtds/struts-2.1.dtd"&&&
&struts&&&
&&&&&package&name="default"&extends="struts-default"&namespace="/"&&&
&&&&&&&&&action&name="login"&class="com.wl.action.test.LoginAction"&&&
&&&&&&&&&&&&&result&name="success"&&&
&&&&&&&&&&&&&&&/success.jsp&&
&&&&&&&&&&&&&/result&&&
&&&&&&&&&/action&&&
&&&&&/package&&&
&/struts&&&
3.LoginAction如下:&
package&com.wl.action.&&
import&java.util.M&&
import&com.opensymphony.xwork2.ActionC&&
import&com.opensymphony.xwork2.ActionS&&
public&class&LoginAction&extends&ActionSupport&{&&
&&&&String&userN&&
&&&&@Override&&
&&&&public&String&execute()&throws&Exception&{&&
&&&&&&&&&&
&&&&&&&&ActionContext&context=ActionContext.getContext();&&
&&&&&&&&Map&session=context.getSession();&&
&&&&&&&&System.out.println("userName="+userName);&&
&&&&&&&&session.put("userName",&userName);&&
&&&&&&&&return&SUCCESS;&&
&&&&public&String&getUserName()&{&&
&&&&&&&&return&userN&&
&&&&public&void&setUserName(String&userName)&{&&
&&&&&&&&this.userName&=&userN&&
4.过滤器FilterTest如下:&
package&com.wl.filter.&&
import&java.io.IOE&&
import&javax.servlet.F&&
import&javax.servlet.FilterC&&
import&javax.servlet.FilterC&&
import&javax.servlet.ServletE&&
import&javax.servlet.ServletR&&
import&javax.servlet.ServletR&&
import&javax.servlet.http.HttpServletR&&
import&javax.servlet.http.HttpServletR&&
import&javax.servlet.http.HttpS&&
public&class&FilterTest&implements&Filter&{&&
&&&&public&void&destroy()&{&&
&&&&&&&&//&TODO&Auto-generated&method&stub&&
&&&&public&void&doFilter(ServletRequest&req,&ServletResponse&res,&&
&&&&&&&&&&&&FilterChain&chain)&throws&IOException,&ServletException&{&&
&&&&&&&&//&TODO&Auto-generated&method&stub&&
&&&&&&&&HttpServletRequest&httpReq=(HttpServletRequest)&&
&&&&&&&&HttpServletResponse&httpRes=(HttpServletResponse)&&
&&&&&&&&HttpSession&httpSession=httpReq.getSession();&&
&&&&&&&&if(httpSession.getAttribute("userName")==null){&&
&&&&&&&&&&&&httpRes.sendRedirect("../login.jsp");&&
&&&&&&&&}else{&&
&&&&&&&&&&&&chain.doFilter(req,&res);&&
&&&&&&&&}&&
&&&&public&void&init(FilterConfig&arg0)&throws&ServletException&{&&
&&&&&&&&//&TODO&Auto-generated&method&stub&&
5.配置Web.xml信息:&
添加信息:&
&!--&configure&filter&--&&&
&&&filter&&&
&&&&&&filter-name&filterTest&/filter-name&&&
&&&&&&filter-class&com.wl.filter.test.FilterTest&/filter-class&&&
&&&/filter&&&
&&&filter-mapping&&&
&&&&&&filter-name&filterTest&/filter-name&&&
&&&&&&url-pattern&/filterJsp/*&/url-pattern&&&
&&&/filter-mapping&&&
&&&!--&configure&session&timeout&one&minute&--&&&
&&&session-config&&&
&&&&&&&session-timeout&1&/session-timeout&&&
&&&/session-config&&&
6.成功跳转页面success.jsp如下:&
&%@&page&language="java"&import="java.util.*"&pageEncoding="UTF-8"%&&&
&%@&taglib&prefix="s"&uri="/struts-tags"&%&&&
String&path&=&request.getContextPath();&&
String&basePath&=&request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";&&
&!DOCTYPE&HTML&PUBLIC&"-//W3C//DTD&HTML&4.01&Transitional//EN"&&&
&&&head&&&
&&&&&base&href="&%=basePath%&"&&&
&&&&&title&My&JSP&'success.jsp'&starting&page&/title&&&
&&&&&meta&http-equiv="pragma"&content="no-cache"&&&
&&&&&meta&http-equiv="cache-control"&content="no-cache"&&&
&&&&&meta&http-equiv="expires"&content="0"&&&&&&&
&&&&&meta&http-equiv="keywords"&content="keyword1,keyword2,keyword3"&&&
&&&&&meta&http-equiv="description"&content="This&is&my&page"&&&
&&&&&!--&&
&&&&&link&rel="stylesheet"&type="text/css"&href="styles.css"&&&
&&&/head&&&
&&&body&&&
&&&&Success.&&br&&&
&&&&&a&href="filterJsp/ExtremeCompomentTest_1.jsp"&Forward&to&Filter&URL&/a&&&
&&&/body&&&
7.配置了一个Session的监听器来监听Session是否失效&
package&com.wl.listener.&&
import&javax.servlet.http.HttpSessionE&&
import&javax.servlet.http.HttpSessionL&&
public&class&HttpSessionListenerTest&implements&HttpSessionListener&{&&
&&&&public&void&sessionCreated(HttpSessionEvent&arg0)&{&&
&&&&&&&&//&TODO&Auto-generated&method&stub&&
&&&&&&&&System.out.println("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS);&&
&&&&public&void&sessionDestroyed(HttpSessionEvent&arg0)&{&&
&&&&&&&&//&TODO&Auto-generated&method&stub&&
&&&&&&&&System.out.println("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE");&&
8.WebRoot的目录结构:&
----WebRoot&
------filterJsp&
&&&&&&&&&&&&&&&
-----ExtremeCompomentTest_1.jsp&
------login.jsp&
------success.jsp&
在IE中输入:http://localhost:8080/FileUpload/login.jsp如下显示&
提交表单之后跳转的页面为:&
等待1分钟之后,在Eclipse的控制台出现"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"信息时,即Session已经失效了,再点击上面的"Forward
URL"链接,这时候过滤器filter就会起作用,验证Session失效后,跳转到登录界面。&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。java web 项目 添加登陆过滤器后,出现“此网页包含重定向循环”问题
[问题点数:30分,结帖人u]
java web 项目 添加登陆过滤器后,出现“此网页包含重定向循环”问题
[问题点数:30分,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&

我要回帖

更多关于 php filter 过滤器 的文章

 

随机推荐