过滤器如何设置登录拦截

过滤器如何设置登录拦截

# 具体遇到的问题
要如何设置拦截BookController下面的网页进行登录验证
# 报错信息的截图

# 相关课程内容截图

http://img1.sycdn.imooc.com//climg/5fa761aa0969f21719201048.jpg

http://img1.sycdn.imooc.com//climg/5fa761aa09d5c54319201048.jpg


# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这里输入代码,可通过选择【代码语言】突出显示

AuthFilter.java

package com.imooc.library.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 判断用户是否登录的过滤器
 * @author 林文佳
 *
 */
public class AuthFilter implements Filter {

    private String login_path;
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;
        if( req.getSession().getAttribute( "login" ) == null ) {
            res.sendRedirect( login_path );
        }else {
            chain.doFilter(req, res);
        }

    }

    @Override
    public void init(FilterConfig filterConfig ) throws ServletException {
        // TODO Auto-generated method stub
        login_path = filterConfig.getInitParameter( "login_path" );

    }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>library</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
  <filter>
      <filter-name>EncodeFilter</filter-name>
      <filter-class>com.imooc.library.filter.EncodeFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>EncodeFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
   
  <filter>
      <filter-name>AuthFilter</filter-name>
      <filter-class>com.imooc.library.filter.AuthFilter</filter-class>
      <init-param>
          <param-name>login_path</param-name>
          <param-value>/management?method=login</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>AuthFilter</filter-name>
      <url-pattern></url-pattern>
  </filter-mapping>
 
</web-app>​

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学你好,1、同学通过默认页面index.html跳转到controller,再由controller跳转到登录页面login.jsp,在这个过程中由index.html跳转到controller中,这个controller在拦截器中有没有放行呐。

这样跳转经过路径更多,建议同学直接跳转到login.jsp再来试试。

    2、根据同学的描述,打开过滤器会出现循环重定向,查看同学的AuthFilter 中并没有重定向语句,是同学在其它地方添加了重定向语句吗?

另外,建议同学在对应条件下添加路径跳转语句。

http://img1.sycdn.imooc.com//climg/5fab49d809f95fcc05460219.jpg

好帮手慕小班 2020-11-10 16:59:42

同学你好,1、问一下同学的登录页面是login.jsp吗,在如下的放行内容中

http://img1.sycdn.imooc.com//climg/5faa52f209ad54f406360195.jpg

同学的登录页面名称是login吗

    2、同学可以尝试访问登录页面的login.jsp,然后输出拦截器中的requestURI

查看一下输出地址是否存在login.jsp的内容,如果存在,通过判断后,检查flag是不是为true。

如上所示排查一下拦截器的拦截地址内容。


  • 提问者 被抱的树 #1
    老师,登录界面一开始是通过默认页面index.html跳转到controller,再由controller跳转到登录页面login.jsp来进行登录验证,打开过滤器会出现循环重定向,是不是因为.jsp文件被拦截的原因?
    2020-11-10 23:09:52
被抱的树 提问者 2020-11-10 10:36:02
package com.imooc.library.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 判断用户是否登录的过滤器
* @author 林文佳
*
*/
public class AuthFilter implements Filter {

private String login_path;
@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
boolean flag = false;
String requestURI = req.getRequestURI();
String[] url = { ".js", ".css", ".ico", ".jpg", ".png", "/login", ".html" };
for( String str : url ) {
if( requestURI.indexOf( str ) != -1 ) {
flag = true;
break;
}
}
String login = (String)req.getSession().getAttribute( "login" );
if( flag ) {
chain.doFilter( request, response );
}else if( login == null ) {
System.out.println( "我还没登录!" );
}
System.out.println( login + "我是拦截器的" );

}

@Override
public void init(FilterConfig filterConfig ) throws ServletException {
// TODO Auto-generated method stub
login_path = filterConfig.getInitParameter( "login_path" );
System.out.println( login_path + "我是拦截器" );
}

}

老师,这是我过滤器的代码。使用过滤器后直接连登录页面都出不来,整个网页就是一片空白。


好帮手慕小班 2020-11-08 12:03:06

同学你好,同学可以参考如下思路来实现:

同学可以在拦截器配置中拦截所有请求:

http://img1.sycdn.imooc.com//climg/5fa76db20963681b05550102.jpg

然后在拦截器中,放行登录请求和静态资源的内容,比如:

http://img1.sycdn.imooc.com//climg/5fa76def095da07606940349.jpg

参考如上思路实现一下。

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师