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
    评论
在使用Servlet+JSP+Spring IOC开发用户登录/注册系统时,可能会遇到以下问题,并提供相应的解决方法: 1. 配置问题:可能会遇到Spring IOC配置不正确或与Servlet容器整合的配置问题解决方法是仔细检查Spring IOC配置文件,确保正确配置了相关的Bean和依赖注入。 2. 控制器问题:可能会遇到控制器无法接收请求参数或处理请求的问题解决方法是确保控制器中的请求参数与表单中的参数一致,使用正确的注解来接收参数,并编写正确的业务逻辑代码来处理请求。 3. 数据库连接问题:可能会遇到数据库连接失败或连接池配置问题解决方法是检查数据库连接配置是否正确,确保数据库服务正常运行,并配置正确的连接池参数以提高性能和稳定性。 4. 数据校验问题:可能会遇到用户输入的数据不符合要求或存在安全漏洞的问题解决方法是使用前端校验、后端校验等方式来确保数据的合法性和安全性。 5. 页面跳转问题:可能会遇到页面跳转失败或跳转逻辑错误的问题解决方法是检查跳转路径是否正确,确保页面的URL、请求方式等参数设置正确,并编写正确的跳转逻辑代码。 6. 登录状态管理问题:可能会遇到登录状态管理不正确或会话管理问题解决方法是使用会话管理技术,如使用Session对象存储登录状态信息,并在必要的地方进行会话验证和权限控制。 7. 异常处理问题:可能会遇到程序异常或错误的问题解决方法是合理地捕获和处理异常,避免程序崩溃,并提供友好的错误提示给用户。 8. 性能问题:可能会遇到系统性能低下或响应时间长的问题解决方法是进行性能优化,如合理使用缓存、优化数据库查询语句、使用异步处理等方式来提高系统性能。 综上所述,使用Servlet+JSP+Spring IOC开发用户登录/注册系统时,可能会遇到各种问题,但只要仔细检查和解决方案,就能够解决这些问题并成功实现功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值