利用过滤器禁止未登录的用户访问网站

为了安全考虑,最近写的一个项目需要加一个限制,禁止未登录的用户访问网站,想到了用过滤器

第一版:

public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

		
		String requestURI = req.getRequestURI().substring(
				req.getRequestURI().lastIndexOf("/"),
				req.getRequestURI().length());
     
		// 如果第一次请求不为登录页面,则进行检查用session内容,如果为登录页面就不去检查.
		if (!"/login.html".equals(requestURI)
				&& !"/LoginServlet".equals(requestURI)) {
			// 取得session. 如果没有session则自动会创建一个,
			// 我们用false表示没有取得到session则设置为session为空.
			HttpSession session = req.getSession(false);
			// 如果session中没有任何东西.
			if (session == null || session.getAttribute("user") == null) {
				res.sendRedirect(req.getContextPath() + "/login.html");
				// 返回
				return;
			}

		}
		// session中的内容等于登录页面, 则可以继续访问其他区资源.
		chain.doFilter(req, res);

	}

结果登录页面的背景图片和验证码(图片)显示不出来,没有考虑首页需要访问其他资源。

第二版:

public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

		
		String requestURI = req.getRequestURI().substring(
				req.getRequestURI().lastIndexOf("/"),
				req.getRequestURI().length());
	       //得到session,如果没有,返回null 
               HttpSession session = req.getSession(false);
     
		if (session == null || session.getAttribute("user") == null) {
                 //如果请求的是图片,不做处理
		 if (requestURI.indexOf(".jpg") > 0 || requestURI.indexOf(".bmp") > 0
			     || requestURI.indexOf(".gif") > 0
			     || requestURI.indexOf(".img") > 0
			     || requestURI.equals("/GetAuthCodeServlet")) {
			    chain.doFilter(req, res);
			   }else if(!"/login.html".equals(requestURI)
						&& !"/LoginServlet".equals(requestURI)){
				   res.sendRedirect(req.getContextPath() + "/login.html");
					
					return;
			   }
		   }

		
		// session中的内容等于登录页面, 则可以继续访问其他区资源.
		chain.doFilter(req, res);

	}
登录时,总是验证码校验错误,后台打印一下发现所有资源访问了两遍,页面上显示的还是第一次生成的验证码,而判断是用第二次生成的验证码。
第三版:
public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  
  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse res = (HttpServletResponse) response;
  
  String requestURI = req.getRequestURI().substring(
    req.getRequestURI().lastIndexOf("/"),
    req.getRequestURI().length());
        //得到session,如果没有,返回null 
               HttpSession session = req.getSession(false);
          
  if (session == null || session.getAttribute("user") == null) {
                 //如果session为空且请求的不是登陆页面资源,跳到登陆页面
    if(!"/login.html".equals(requestURI)
      && !"/LoginServlet".equals(requestURI)
      && !"/GetAuthCodeServlet".equals(requestURI)
      && !"/login.gif".equals(requestURI)
      && !"/login_bg.jpg".equals(requestURI)){
       res.sendRedirect(req.getContextPath() + "/login.html");
       return;
      }
     }
  // session中的内容等于登录页面, 则可以继续访问其他区资源.
  chain.doFilter(req, res);
 }
访问正常。

配置web.xml
<pre class="html" name="code"><filter> 
     <filter-name>LoginFilter</filter-name> 
     <filter-class>com.csr.filter.LoginFilter</filter-class> 
 </filter> 
 <filter-mapping> 
     <filter-name>LoginFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
 </filter-mapping> 


 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值