Filter, listener, Servlet3.0 comment

A filter

1 Introduction

Filter the complete process: Filter pretreatment user requests, then the request to the Servlet and processed to generate a response, and then after the last treatment Filter server response. In a web application, you may develop a plurality of write Filter, which is called a combined Filter Filter chain.

[Pictures of foreign chains dump fails, the source station may have a security chain mechanism, it is recommended to save the picture down directly upload (img-wsJrVIMB-1582630865316) (C: \ Users \ Hello Word \ AppData \ Roaming \ Typora \ typora-user-images \ 1582629150766.png)]

2. Implement

init (), doFilter (), destroy () are executed in the respective timing. Late observe the life cycle.

Filter implementation requires only two steps:

Step1: write java class implements the Filter interface and implement its doFilter method.

Step2: to register the filter class written in web.xml, and set it can intercept resource

public class Filter01 implements Filter {

	/**
	 * 初始化
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("Filter01 init...");
		
	}

	/**
	 * 处理请求的拦截方法
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		// 处理请求
		System.out.println("Filter01  处理请求...");
		
		// 放行资源
		chain.doFilter(request, response);
		
		// 处理响应
		System.out.println("Filter01  处理响应...");
		
	}

	/**
	 * 销毁方法
	 */
	@Override
	public void destroy() {
		System.out.println("Filter01 destroy...");
		
	}

}


//web.xml配置
<filter>
  	<filter-name>Filter01</filter-name> <!-- 给服务器看的,与filter-mapping标签中filter-name保持一致 -->
  	<filter-class>com.shsxt.filter.Filter01</filter-class> <!-- 类的全路径 -->
  </filter>
  <filter-mapping>
  	<filter-name>Filter01</filter-name> <!-- 给服务器看的,与filter标签中filter-name保持一致 -->
  	<url-pattern>/Servlet01</url-pattern> <!-- 给浏览器看的,需要拦截的资源路径 -->
  	<!-- <servlet-name>Servlet01</servlet-name> --> <!-- 想要拦截的servlet名称,与servlet标签的servlet-name一致 -->
  </filter-mapping>

3. The execution order of the filter

filter

Request data before intercepting the request reaches the specified resource

Response Response to intercept the data before they reach the client

Release resources (chain.doFilter (request, response))

Filter chain

Simultaneously performing a plurality of filters

Execution order: web.xml configuration file to configure the first execution

Order intercept: interception in a specified order, in reverse order in response to

Request: (1 -> 2 -> 3)

Response: (3 -> 2 -> 1)

4. A filter instance

/**
 * 非法访问拦截
 * 	当用户访问登录状态才能访问的资源时,如果用户未登录,会被拦截到登录页面
 * 	
 * 	拦截的资源:
  		拦截所有资源  /*
  		
  	需要放行的资源:
  		1、指定页面,放行
  			无需登录即可访问的页面 (例如:登录页面、注册页面等)
  		2、静态资源,放行
  			js文件、css文件及图片(存放在statics目录下的资源)
  		3、指定操作,放行
  			无需登录即可执行的操作 (登录操作、注册操作等)
  		4、登录状态,放行
  			判断session作用域中是否存在用户数据(有数据=登录状态;无数据=非登录状态)
 		
 		当用户未登录时访问资源,拦截跳转到登录页面
 */
public class LoginAccessFilter implements Filter {
    
    public LoginAccessFilter() {
        
    }

	public void destroy() {
		
	}
	
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
		
		// 基于HTTP
		HttpServletRequest request = (HttpServletRequest)arg0;
		HttpServletResponse response = (HttpServletResponse)arg1;
		
		// 获取当前访问的资源路径
		String path = request.getRequestURI(); // 从端口号后开始(不包含端口),到"?"前面	/站点名/资源路径
		System.out.println(path);
		
		// 1、指定页面,放行       无需登录即可访问的页面 (例如:登录页面、注册页面等)
		if (path.contains("/login.html")) {
			// 放行资源
			chain.doFilter(request, response);
			return;
		}
		
		// 2、静态资源,放行         js文件、css文件及图片(存放在statics目录下的资源)
		if (path.contains("/statics")) {
			// 放行资源
			chain.doFilter(request, response);
			return;
		}
		
		// 3、指定操作,放行        无需登录即可执行的操作 (登录操作、注册操作等)
		if (path.indexOf("/loginServlet") != -1) {
			// 放行资源
			chain.doFilter(request, response);
			return;
		}
		
		// 4、登录状态,放行 	判断session作用域中是否存在用户数据(有数据=登录状态;无数据=非登录状态)
		String user = (String) request.getSession().getAttribute("user");
		if (user != null && !"".equals(user)) {
			// 放行资源
			chain.doFilter(request, response);
			return;
		}
		
		// chain.doFilter(request, response);
		
		// 拦截请求跳转到登录页面
		response.sendRedirect("login.html");
	
	}

	public void init(FilterConfig fConfig) throws ServletException {
		
	}

}


/**
 * 用户登录
 */
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("用户登录...");
		
		// 接收参数
		System.out.println(request.getParameter("uname"));
		
		// 模拟用户在登录状态
		request.getSession().setAttribute("user", "zhangsan");
		
		// 登录成功
		response.sendRedirect("index.html");
	}

}

Second, the listener

1 Introduction

web Listener Servlet in a special class, ServletContext, HttpSession, ServletRequest of creation and destruction; create variables, such as destruction and modification.

2. Implement

public class Listener01 implements HttpSessionListener,HttpSessionAttributeListener {

	/**
	 * session的创建
	 */
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("Session Create...");
	}

	/**
	 * session的销毁
	 */
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("Session Destroy...");
	}

	/**
	 * 设置域对象
	 */
	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		System.out.println("attributeAdded...");
		
	}

	/**
	 * 删除域对象
	 */
	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
		System.out.println("attributeRemoved...");
		
	}

	/**
	 * 修改域对象
	 */
	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		System.out.println("attributeReplaced...");
		
	}

}

//servlet

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 创建session对象
		HttpSession session  = request.getSession();
		
		// 设置域对象
		session.setAttribute("uname", "zhangsan");
		
		// 修改域对象
		session.setAttribute("uname", "lisi");
		
		// 删除域对象
		session.removeAttribute("uname");
		
		// session的销毁
		session.invalidate();
	}

3. Listeners Case

/**
 * 在线人数统计
 * 	当有新的session对象被创建,则在线人数+1;
 * 	有session对象被销毁,在线人数-1;
 * @author Lisa Li
 *
 */
public class OnlineListener implements HttpSessionListener {
	
	// 默认在线人数
	private Integer onlineNumber = 0;

	/**
	 * 当有新的session对象被创建,则在线人数+1;
	 */
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// 人数+1
		onlineNumber++;
		// 将人数存到session作用域中
		//se.getSession().setAttribute("onlineNumber", onlineNumber);
		// 将人数存到application作用域中
		se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
		
	}

	/**
	 * 有session对象被销毁,在线人数-1;
	 */
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// 人数-1
		onlineNumber--;
		// 将人数存到session作用域中
		// se.getSession().setAttribute("onlineNumber", onlineNumber);
		// 将人数存到application作用域中
		se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
		
	}

}

/**
 * 在线人数统计
 */
public class OnlineServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	//引入日志
	//private logger logger=LoggerFactory.getLogger(OnlineServlet.class);
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//得到参数
		String key=request.getParameter("key");
		
		//判断是否为空
		if(key==null || "".equals(key)){
			//创建session对象
			HttpSession session=request.getSession();
			//获取session作用域中人数application
			Integer onlineNumber=(Integer) session.getServletContext().getAttribute("onlineNumber");
			//当前访问用户的ip及内容
			String ip=request.getRemoteAddr();
			String content=request.getParameter("content");
			System.out.println(ip);
			System.out.println(content);
			//输出
			response.setContentType("text/html;charset=UTF-8");
			response.getWriter().write("<h2>在线人数:"+onlineNumber+"</h2><h4><a href='Servlet01?key=logout'>退出</a><h4>");
			
		}else{
			//传递了参数,表示要做用户推出操作
			request.getSession().invalidate();
		}
	}

}

Three, Servlet3.0 comments

1. @ WebServlet

@WebServlet annotation will inherit a class marked as javax.servlet.http.HttpServlet Servlet can handle the user request.

//@WebServlet(value="/Servlet01")
//@WebServlet(name="Servlet01",value="/Servlet01")
//@WebServlet(value={"/Servlet01","/Servlet001"})
//@WebServlet(urlPatterns="/s01")
//@WebServlet(urlPatterns={"/Servlet01","/Servlet001"})
@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet...");
		
	}

}

2.@WebFilter

When using Note: filter chain class name in alphabetical order (in most cases)

@WebFilter("/*")
public class Filter01 implements Filter {

    /**
     * Default constructor. 
     */
    public Filter01() {
        // 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 {
		System.out.println("Filter01...");
		chain.doFilter(request, response);
	}

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

}

3.@WebListener

Servlet3.0 provide @WebListener annotation defines a class that implements the interface for the specific listener to listen

Device. The interface implements ServletContextListener MyServletContextListener labeled listener.

@WebListener
public class Listener01 implements HttpSessionListener {

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

	/**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent se)  { 
         // TODO Auto-generated method stub
    }

	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent se)  { 
         // TODO Auto-generated method stub
    }
	
}

4.@MultipartConfig

File Upload

  • @MultipartConfig sure to add notes! ! ! ! !

  • If the foreground form type is set to enctype = "multipart / form-data", the background servlet must be annotated otherwise, all of the arguments are null.

    Use annotations @MultipartConfig the Servlet identifies a file upload support. Servlet3.0 the multipart / form-data POST request encapsulated into Part, operate on files uploaded Part.

    @MultipartConfig
    @WebServlet("/uploadServlet")
    public class UploadServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		// 获取参数
    		String uname = request.getParameter("uname");
    		System.out.println(uname);
    						
    		
    		
    		// 得到要上传的文件对象   getPart(name):name代表的是表单元素file文件域的name属性值
    		Part part = request.getPart("myfile");
    		// 得到文件存放的路径
    		String path  = request.getServletContext().getRealPath("/");
    		// 得到上传的文件名
    		String fileName = part.getSubmittedFileName();
    		// 上传
    		part.write(path +"/"+fileName);
    		
    		
    	}
    
    }
    
    <body>
    
    	<!-- 
    		表单实现文件上传
    			第一步:设置表单类型 enctype="multipart/form-data" (文件上传表单)
    			第二步:表单提交类型 method="POST"
    			第三步:文件域file元素设置name属性值
    	 -->
    	 <form action="uploadServlet" method="POST" enctype="multipart/form-data" >
    	 	姓名:<input type="text" name="uname" /> <br>
    	 	文件:<input type="file" name="myfile" /> <br>
    	 	<button>提交</button>
    	 </form>
    </body>
    
Published 32 original articles · won praise 2 · Views 1269

Guess you like

Origin blog.csdn.net/qq_41128049/article/details/104503754