判断用户是否登陆的过滤器要怎么写?

判断用户是否登陆的过滤器要怎么写?

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

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>登录</title>
        <link rel="stylesheet" href="css/login.css">
        
        <script type="text/javascript">
            function changeImg(){
            	var codeImg=document.getElementById("codeImg");
            	codeImg.src="${pageContext.request.contextPath}/CheckImgServlet?time="+new Date().getTime();
            }
        </script>        
    </head>
    <body>
        <div class="login">
            <div class="header">
                <h1>
                    <a href="/login.do">登录</a>
                </h1>
                <button></button>
                
            </div>
            <p style="margin-left:50px;">${requestScope.msg }</p>
            <form action="${pageContext.request.contextPath}/LoginServlet" method="post">
                <div class="name">
                    <input type="text" id="name" name="username">
                    <p></p>
                </div>
                <div class="pwd">
                    <input type="password" id="pwd" name="password">
                    <p></p>
                </div>
                <div class="code">
                    <input type="text" id="code" name="verifyCode" style="width: 150px">
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <img id="codeImg" onclick="changeImg()" src="${pageContext.request.contextPath}/CheckImgServlet" style="width: 150px;height: 42px;vertical-align: middle;">
                    <p></p>
                </div>
                <div class="btn-red">
                    <input type="submit" value="登录" id="login-btn">
                </div>
            </form>
        </div>
    </body>
</html>

LoginServlet.java

package com.imooc1.web.servlet;

import java.io.IOException; 
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc1.domain.User;
import com.imooc1.service.UserService;
import com.imooc1.service.impl.UserServiceImpl;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 完成验证码的校验
		// 获得session中保存的验证码信息
		String code1=(String)request.getSession().getAttribute("checkCode"); 
		// 接收前台表单提交的验证码的信息
		String code2=request.getParameter("verifyCode");
		if(code2==null||!code2.equalsIgnoreCase(code1)) {
			request.setAttribute("msg","验证码输入不正确");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
			return;
		}
		
		
		
		
		// 接收数据:
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		// 封装数据:
		User user=new User();
		user.setUsername(username);
		user.setPassword(password);
		// 处理数据:完成登录.
		UserService userService=new UserServiceImpl();
		// 获得用户列表的集合
		List<User> userList=(List<User>)getServletContext().getAttribute("userList");
		User existUser=userService.login(userList,user);
		// 显示结果:
		if(existUser==null) {
			// 登录失败
			request.setAttribute("msg", "用户名或密码错误");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}else{
			// 登录成功
			// 将用户信息保存
			request.getSession().setAttribute("existUser", existUser);
			response.sendRedirect(request.getContextPath()+"/categoryList.html");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

AuthFilter.java

package com.imooc1.web.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.annotation.WebFilter;

/**
 * Servlet Filter implementation class AuthFilter
 */
@WebFilter("/AuthFilter")
public class AuthFilter implements Filter {

    /**
     * Default constructor. 
     */
    public AuthFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		String username=request.getParameter("username");
		if(username==null) {
			// 未登录
			request.setAttribute("msg", "用户未登陆");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}else {
			chain.doFilter(request, response);
		}
        
		
		
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

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>book_management</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>AuthFilter</filter-name>
    <filter-class>com.imooc1.web.filter.AuthFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/LoginServlet</url-pattern>
  </filter-mapping>
</web-app>

从login.jsp页面发来的请求会先被过滤器拦截,如果然后才可能到LoginServlet,对吗?

xml中的<url-pattern>标签要怎么写?

在LoginServlet 中已经对用户登录信息进行判断了,如果登录信息为空或者不正确都不能登录。过滤器是在登录信息传到LoginServlet 之前就拦截一下,判断是否为空吗?

如果不为空就执行chain.doFilter(request, response) 这这句话吗?

执行了chain.doFilter(request, response) 这句话信息就能往后传给LoginServlet 吗?  

如果为空要怎么拦截,用请求转发给login.jsp页面行吗?

正在回答 回答被采纳积分+1

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

7回答
提问者 电磁护盾 2020-03-29 20:36:01

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

还有是不是用了if else结构,这个return就可以注释掉?

  • 同学你好,如果if else后还有代码,会执行代码,所以这里的return;建议同学写上。
    2020-03-30 11:31:16
提问者 电磁护盾 2020-03-29 20:34:36
package com.imooc1.web.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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc1.domain.User;


@WebFilter("/AuthFilter")
public class AuthFilter implements Filter {

    public AuthFilter() {
        // TODO Auto-generated constructor stub
    }


	public void destroy() {
		// TODO Auto-generated method stub
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("过滤器已生效");
		
		String str=((HttpServletRequest) request).getRequestURI().toString();
		System.out.println(str+"<————————");
		if(str.indexOf(".css")>0||str.indexOf(".jpg")>0||str.indexOf(".png")>0||str.indexOf("login")>0||str.indexOf("LoginServlet")>0||str.indexOf("UserService")>0||str.indexOf("CheckImgServlet")>0) {
			System.out.println("过滤器已生效A");
			chain.doFilter(request, response);
			//return;
		}else {
		    User user= (User) ((HttpServletRequest) request).getSession().getAttribute("existUser");
		    if(user==null||"".equals(user)) {
		    	System.out.println("过滤器已生效B");
		    	// 未登录
		    	request.setAttribute("msg1", "用户未登陆");
		    	((HttpServletResponse)response).sendRedirect(((HttpServletRequest) request).getContextPath()+"/login.jsp");
		    	return;
		    }else {
		    	System.out.println("过滤器已生效C");
		    	chain.doFilter(request, response);
		    	return;
		    }
		}

	    
//		if(str.indexOf(".css")>0||str.indexOf(".jpg")>0||str.indexOf(".png")>0||str.indexOf("login")>0||str.indexOf("LoginServlet")>0||str.indexOf("UserService")>0||str.indexOf("CheckImgServlet")>0) {
//			System.out.println("过滤器已生效A");
//			chain.doFilter(request, response);
//			return;
//		}
//	    User user= (User) ((HttpServletRequest) request).getSession().getAttribute("existUser");
//	    if(user==null||"".equals(user)) {
//	    	System.out.println("过滤器已生效B");
//	    	// 未登录
//	    	request.setAttribute("msg1", "用户未登陆");
//	    	((HttpServletResponse)response).sendRedirect(((HttpServletRequest) request).getContextPath()+"/login.jsp");
//	    	return;
//	    }else {
//	    	System.out.println("过滤器已生效C");
//	    	chain.doFilter(request, response);
//	    	return;
//	    }
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}
}

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

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

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

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

之前这个过滤器有问题,我现在把其他功能都写完了,然后又来写这个过滤器。  这个过滤器这么写对不对?   这样写完之后各种效果运行正常。

是不是在if判断中还要加上 ||str.indexOf("LoginServlet")>0||str.indexOf("UserService")>0||str.indexOf("CheckImgServlet")>0 才行?   这样才能生成existUser,然后才能在过滤器里去进行后面的if判断。  还有加上这些才能在login.jsp页面生成验证码图片。

  • 同学你好, 1、拦截器中可以这样写: User user = (User) req.getSession().getAttribute("existUser"); String requestURI = req.getRequestURI(); //不需要过滤的url String[] urls = {"/CheckImgServlet", "/LoginServlet", ".js",".css", ".ico",".jpg",".png"}; boolean flag = false; for (String str : urls) { if (requestURI.indexOf(str) != -1) { flag = true; break; } } if (flag || user!=null) { System.out.println("放行"); chain.doFilter(request, response); return; }else { System.out.println("未登录不放行"); // 未登录 resp.sendRedirect(req.getContextPath()+"/login.jsp"); return; } 2、修改web.xml,/*代表拦截所有请求。修改如下: <filter> <filter-name>AuthFilter</filter-name> <filter-class>com.imooc1.web.filter.AuthFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
    2020-03-30 11:37:19
好帮手慕柯南 2020-03-22 11:06:46

同学你好!

你以下两个if是相对独立的

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

所以上面的执行了之后,后面的还是会执行,建议你在以下位置添加return

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

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~


好帮手慕小尤 2020-03-22 11:05:24

同学你好,同学可以先放行css,js,png图片以及访问login相关方法,然后进行过滤user为null的。如果为null,则直接跳转到login.jsp文件中。修改后代码如下:

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

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("过滤器已生效");
		
		String str=((HttpServletRequest) request).getRequestURI().toString();
		System.out.println(str+"<————————");
		if(str.indexOf(".css")>0||str.indexOf(".jpg")>0||str.indexOf(".png")>0 || str.indexOf("login")>0) {
			System.out.println("过滤器已生效A");
			chain.doFilter(request, response);
			return; 
		}
		User user= (User) ((HttpServletRequest) request).getSession().getAttribute("existUser");
		if(user==null || "".equals(user)) {
			System.out.println("过滤器已生效B");
			// 未登录
			request.setAttribute("msg", "用户未登陆");
			((HttpServletResponse)response).sendRedirect(((HttpServletRequest) request).getContextPath()+"/login.jsp");
			return;
		}else {
			System.out.println("过滤器已生效C");
			chain.doFilter(request, response);
			return;
		}
		
	}

如果我的回答解决了你的问题,请采纳!祝学习愉快!

提问者 电磁护盾 2020-03-21 20:24:27
package com.imooc1.web.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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc1.domain.User;


@WebFilter("/AuthFilter")
public class AuthFilter implements Filter {

    public AuthFilter() {
        // TODO Auto-generated constructor stub
    }


	public void destroy() {
		// TODO Auto-generated method stub
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("过滤器已生效");
		
		String str=((HttpServletRequest) request).getRequestURL().toString();
		System.out.println(str+"<————————");
		if(str.indexOf("css")!=-1||str.indexOf("ogin")!=-1) {
			System.out.println("过滤器已生效A");
			chain.doFilter(request, response);
			
		}
		User user= (User) ((HttpServletRequest) request).getSession().getAttribute("existUser");
		if(user==null) {
			System.out.println("过滤器已生效B");
			// 未登录
			request.setAttribute("msg", "用户未登陆");
			((HttpServletResponse)response).sendRedirect(((HttpServletRequest) request).getContextPath()+"/login.jsp");
		}else {
			System.out.println("过滤器已生效C");
			chain.doFilter(request, response);
		}
		
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

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

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

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

还是没成功。

请问,哪里写错了?

好帮手慕阿莹 2020-03-21 13:48:55

同学你好,

首先,我们判断用户是否登录不应该是request域中获取,而是要在session域中获取。

所以

User user= (User) request.getSession().getAttribute("existUser");

并且,我们不应该是拦截登录的Servlet,我们应该拦截的是除了的登录的servlet以及登录的jsp和css样式。

所以我们可以配置

<filter>
    <filter-name>AuthFilter</filter-name>
    <filter-class>com.imooc1.web.filter.AuthFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

并且在过滤器中获取一下这个url,判断一下,包含.css的放行一下,包含login的放行一下。

其他的都要判断User user= (User) request.getSession().getAttribute("existUser");中user是否为null,如果是,则重定向会登陆的页面。如果不是null,说明登录了,就可以放行了。

如果我的回答解决了你的问题,请采纳,祝学习愉快.

 


提问者 电磁护盾 2020-03-21 08:43:12


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

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

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

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

加上过滤器,不输入用户名和密码,只输入验证码就登陆,提示的错误信息没有显示 "用户未登录" ,只在控制台输出了过滤器已生效。   提示的错误信息是 用户名或密码错误,跟不加过滤器时的效果是一样的。

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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