当前位置:编程学习 > JAVA >>

servlet 的Filter 的使用

我想使用filter 过滤未登陆的用户,代码如下:
/**
 * 功能:过滤器
 */
public class SessionFilter implements Filter {

public void init(FilterConfig filterconfig) throws ServletException {
}

public void destroy() {
}
/** 过滤方法 */
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

// 获取uri地址   
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse)resp;
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute("User") == null){
     System.out.println("上下文目录:"+request.getContextPath());
 response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action");
 return ;
}

}

但结果 变成了一个死循环了。理论上 没有问题啊。为什么 会这样。 --------------------编程问答-------------------- 大概,你访问的路径都是XXXX.action吧
你所有的页面都是被拦截器拦截的吧
包括你的登录页面的吧
这个就是原因
另外你应该跳转到都某个jsp或者html中
你又重新跳入了XXXX.action
自然还会拦截

你在大脑里稍微模拟下这个过程就能知道这个答案了
--------------------编程问答-------------------- 你这只对未登录的拦截,登录的你没给放行啊,
chain.doFilter(request, response); 不知道我说的对不对 --------------------编程问答-------------------- 对,就像2楼说的,你返回到response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action"); 
登录的action ,这不还是执行登录, 于是又进到拦截,如此反复,你返回到login.jsp 它不就回去了 --------------------编程问答--------------------


<!-- 系统的FILTER -->
<filter>  
        <filter-name>SESSION FILTER</filter-name>  
        <filter-class>com.wlzx.web.common.SessionFilter</filter-class>  
    </filter>   
    <filter-mapping>  
        <filter-name>SESSION FILTER</filter-name>  
<url-pattern>*.action</url-pattern>
    </filter-mapping>
    <filter-mapping>  
        <filter-name>SESSION FILTER</filter-name>  
<url-pattern>/actions/*</url-pattern>  
    </filter-mapping>  

如果 不过滤 xx.jsp .那么 就会 进入到 某个后台页面 。
具体的 某个动用 是exposition/actions/loginAction 或 exposition/actions/loginAction!index
过滤器 没有启作用。 --------------------编程问答-------------------- 楼主要实现登陆拦截的话就要把登陆页面和登陆以后的页面放在不同的文件夹下面,这样一来,楼主就只需要拦截存放登陆以后页面的那个文件夹,就行了,比如你的login.jsp放在WEB-INF下面,而你的登陆以后的jsp放在front包下面,那么楼主的url-pattern就可以这么写了/front/* 这样就不会拦截到login.jsp了。也就不会有死循环了。 --------------------编程问答--------------------
引用 4 楼 liuc0317 的回复:
Java code?12345678910111213    <!-- 系统的FILTER -->    <filter>          <filter-name>SESSION FILTER</filter-name>          <filter-class>com.wlzx.web.common.SessionFilter</filter-class>   ……


就算到某个后台页面,只要操作也会返回到登录页面的。。。
要不就放在不同文件夹下,
不然会死循环。。。。 --------------------编程问答--------------------
<filter-mapping>  
        <filter-name>SESSION FILTER</filter-name>  
        <url-pattern>/actions/*</url-pattern>  
    </filter-mapping>  

不要这个 或者把登录页面换个文件夹 --------------------编程问答-------------------- 回复你们,前后台页面 是分包来放的,访问前端 页面 /fornt/ 不需要登陆。
后端在/manage/ 包下。这个下边的需要登陆。现在换一种写法。主要代码如下。
	public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain chain) {
this.chain = chain;
this.request = (HttpServletRequest) servletRequest;
// 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,
// 就要把此request对象构造成HttpServletRequest
this.response = ((HttpServletResponse) servletResponse);
// 获取当前页面文件名此处url为:/Gzlkh/login.jsp
String url = request.getRequestURI();//   /exposition/main.jsp
// 此处截取的url为:login.jsp
url = url.substring(url.lastIndexOf("/") + 1, url.length());//main.jsp
try {
HttpSession session = request.getSession();
// 获取网站访问根目录/exposition
String accessPath = request.getContextPath();
// 获取用户登录验证信息
User st = (User) session.getAttribute("user");
if (noFileUrl(url, request)) {
// 不需要判断权限的请求如登录页面,则跳过
chain.doFilter(request, response);// 继续执行请求
} else if (st == null) {
response.sendRedirect(accessPath + "/login.jsp");
// 未登录或超时,返回登陆页面

} else {
verifyUrl(url, st);// 判断当前user是否拥有访问此url的权限
}
} catch (Exception sx) {
sx.printStackTrace();
}

}

web.xml
 

    <filter>
     <filter-name>permission</filter-name>
     <filter-class>com.wlzx.web.common.PermissionFilter</filter-class>
    </filter>
    <filter-mapping>
     <filter-name>permission</filter-name>
     <!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->
     <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

还会 进入死循环。这个要可以理解。每次 都要 过滤xx.jsp 页面。所以 就死循环了。
但是 怎么 能让他 跳出。 --------------------编程问答-------------------- 明确知道哪几个页面不需要过滤的,直接在前面放行不就完了...

public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain chain) {    
this.chain = chain;
    this.request = (HttpServletRequest) servletRequest;
// 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,    // 就要把此request对象构造成HttpServletRequest    this.response = ((HttpServletResponse) servletResponse);    // 获取当前页面文件名此处url为:/Gzlkh/login.jsp    String url = request.getRequestURI();//   /exposition/main.jsp

if("/index.jsp".equals(url)) {
 chain.doFilter(request,response);
 return;
}

// 你的过滤逻辑
...

--------------------编程问答--------------------


/**
 * 功能:过滤器
 */
public class SessionFilter implements Filter {

public void init(FilterConfig filterconfig) throws ServletException {
}

public void destroy() {
}
/** 过滤方法 */
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

// 获取uri地址   
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse)resp;
//添加这段代码,排除loginJsp.action
if(request.getRequestURI().endsWith("loginJsp.action")){
chain.doFilter(request, response);
return;
}
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute("User") == null){
     System.out.println("上下文目录:"+request.getContextPath());
 response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action");
 return ;
}

}




--------------------编程问答-------------------- 问题的关键是:
   不要用重定向,因为使用重定向中有url地址栏重写,而此又符合过滤器条件而再次调用doFilter,致使死循环;

所以要用请求转发; --------------------编程问答-------------------- 先这样。把不需要过滤的页面 放到一起。
//不需要权限验证的页面动作等
protected boolean noFileUrl(String url, HttpServletRequest request) {
String excludeAll = "login.jsp,first.jsp,down.jsp,top.jsp,center.jsp,left.jsp,right.jsp";
//判断请求页面是否是特殊页面
if (excludeAll.indexOf(url) >= 0) {
return true;
}
return false;

}

然后,到了login.jsp 然后,添写 用户 和密码,并不经过 action 的操作,就进来了。这是什么原因。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,