Servlet+jsp+tomcat--用filter解决字符编码问题_用filter解决session失效问题

文本讲述在servlet+jsp+tomcat基础开发中

1.用filter解决字符编码问题(不需要再在每个Servlet的post方式中写上这样一行代码了request.setCharacterEncoding("utf-8");)

2.用filter解决session失效问题(解决当登陆之后,清除cookie,session依赖于cookie,再刷新页面出现500的问题,不再出现500,而是跳到登录界面)

首先在web.xml中配置filter

字符编码需要过滤到所有url,包括*.action和login

session失效需要过滤到*.action,不需要过滤login

我的servlet除了loginServlet的url是login,其余的均为*.action,解决session失效需要过滤到所有.action登录的时候一直重定向的问题。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <welcome-file-list>
  	<welcome-file>login</welcome-file>
  	
  </welcome-file-list>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.book.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>DashboardServlet</servlet-name>
    <servlet-class>com.book.servlet.DashboardServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>EditBookServlet</servlet-name>
    <servlet-class>com.book.servlet.EditBookServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>SaveBookServlet</servlet-name>
    <servlet-class>com.book.servlet.SaveBookServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ShowMyBookServlet</servlet-name>
    <servlet-class>com.book.servlet.ShowMyBookServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>BookPage</servlet-name>
    <servlet-class>com.book.servlet.BookPageServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>KindOfServlet</servlet-name>
    <servlet-class>com.book.servlet.KindOfServlet</servlet-class>
  </servlet>







  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>DashboardServlet</servlet-name>
    <url-pattern>/dashboard.action</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>EditBookServlet</servlet-name>
    <url-pattern>/editbook.action</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>SaveBookServlet</servlet-name>
    <url-pattern>/savebook.action</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowMyBookServlet</servlet-name>
    <url-pattern>/showbook.action</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>BookPage</servlet-name>
    <url-pattern>/bookpage.action</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>KindOfServlet</servlet-name>
    <url-pattern>/kindof.action</url-pattern>
  </servlet-mapping>

  <error-page>
    <error-code>404</error-code>
    <location>/404.html</location>
  </error-page>
  
  <error-page>
    <error-code>500</error-code>
    <location>/500.html</location>
  </error-page>
  
  
  <!--配置名称为Encoding的Filter  -->
  <filter>
  	<filter-name>Encoding</filter-name>
  	<filter-class>com.book.filter.PageEncodingFilter</filter-class>
  	<init-param>
  	<!-- 为encoding参数配置了utf-8 -->
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <!--  为名称为Encoding的Filter设置过滤所有url
  所有的url都会被EncodingFilter过滤
  -->
  <filter-mapping>
  	<filter-name>Encoding</filter-name>
  	<url-pattern>*.action</url-pattern>
  </filter-mapping>
   <filter-mapping>
  	<filter-name>Encoding</filter-name>
  	<url-pattern>/login</url-pattern>
  </filter-mapping>
  <!--配置 SessionFilter
  不需要登录信息的页面
   -->
  <filter>
  	<filter-name>SessionFilter</filter-name>
  	<filter-class>com.book.filter.SessionFilter</filter-class>
  	<init-param>
  		<param-name>notNeedLoginPages</param-name>
  		<param-value>,login.action</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>SessionFilter</filter-name>
  	<!-- 过滤所有url -->
  	<url-pattern>*.action</url-pattern>
  </filter-mapping> 
</web-app>

PageEncodingFilter

package com.book.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;

/**
 * 
 * PageEncodingFilter干的事情:
 * 
 * 
 * @author y
 *
 */
public class PageEncodingFilter implements Filter {
	
	private String encoding="utf-8";
	protected FilterConfig filterConfig;

	
	//为一个请求过来配置一个utf-8的编码
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		this.filterConfig=filterConfig;
		if(filterConfig.getInitParameter("encoding") !=null) {
			encoding = filterConfig.getInitParameter("encoding");
		}
	}
	
	
	
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		request.setCharacterEncoding("utf-8");
		
		String uri = request.getRequestURI();
		String requestUri = uri.substring(request.getContextPath().length()+1);
		
		//System.out.println(uri+" = "+requestUri);
		//请求继续往下走
		filterChain.doFilter(request, servletResponse);
	}
	
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	

	

}

SessionFilter

package com.book.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;
import javax.servlet.http.HttpSession;

import com.book.entity.User;

public class SessionFilter implements Filter{
	
	private String notNeedLoginPages;
	protected FilterConfig filterConfig;
	
	
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		this.filterConfig=filterConfig;
		if(filterConfig.getInitParameter("notNeedLoginPages") !=null) {
			notNeedLoginPages = filterConfig.getInitParameter("notNeedLoginPages");
			
		}
	}


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

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;
		
		String uri = request.getRequestURI();
		String requestUri = uri.substring(request.getContextPath().length()+1);
		System.out.println("sessionFilter中="+requestUri);
		String [] pages = notNeedLoginPages.split(",");
		boolean isAllow = false;
		for(String page:pages) {
			if(page.equals("requestUri")) {
				isAllow=true;
				break;
			}
			if(requestUri.endsWith(".css") || requestUri.endsWith(".js") ||requestUri.endsWith(".png") || requestUri.endsWith("jpg")) {
				isAllow=true;
				break;
			}
		}
		if(isAllow) {
			filterChain.doFilter(request, response);
			System.out.println("放行-----------------");
			
		}else {
			HttpSession session = request.getSession();
			User user = (User) session.getAttribute("USER");
		
			if(user ==null) {
				//没有user就跳到登录页面
				System.out.println("跳到登录界面-----------------");
				response.sendRedirect(request.getContextPath()+"/login");
			}else {
				filterChain.doFilter(request, response);
			}
		}
	}

	
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值