自动登录FilterSessionCookie综合例子Word下载.docx
- 文档编号:19178317
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:32
- 大小:28KB
自动登录FilterSessionCookie综合例子Word下载.docx
《自动登录FilterSessionCookie综合例子Word下载.docx》由会员分享,可在线阅读,更多相关《自动登录FilterSessionCookie综合例子Word下载.docx(32页珍藏版)》请在冰豆网上搜索。
password"
//数据合法性校验(放在业务层)
if(!
isEmpty(username)&
&
!
isEmpty(password)){
}else{
if(isEmpty(username)){
//如果重定向放到Session里,就是扩大的域,再单独登录会取
//Session中的旧登录数据,这是错误的,而如果在登录UI的Servlet
//先清除Session又无法获取错误信息:
request.setAttribute("
sorry1"
"
用户名不能为空!
}
if(isEmpty(password)){
sorry2"
密码不能为空!
//转发需要注意的就是这个UI页面form要用绝对URL地址,不然会错误,因为前后地址栏不同!
request.getRequestDispatcher("
/servlet/LoginUIServlet"
).forward(request,response);
return;
privatebooleanisEmpty(Stringstr){
if(str==null||str.trim().equals("
)){
returntrue;
returnfalse;
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
doGet(request,response);
}
注意错误提示信息不能存放在Session,解释详见里面注释
UI页jsp:
[html]viewplaincopy在CODE上查看代码片派生到我的代码片
%@pagelanguage="
java"
import="
java.util.*"
pageEncoding="
UTF-8"
%>
!
DOCTYPEHTMLPUBLIC"
-//W3C//DTDHTML4.01Transitional//EN"
>
html>
<
head>
title>
Jsp<
/title>
/head>
body>
h1>
公子小白旗舰店<
/h1>
--发现如果这里用hr元素,下面的form就是报错,这种格式应该是非法,待查-->
formaction="
${pageContext.request.contextPath}/servlet/LoginSubmitServlet"
method="
post"
tablewidth="
30%"
align="
center"
border="
0px"
tr>
tdalign="
登录名:
/td>
td>
inputtype="
text"
name="
/>
${requestScope.sorry1}<
/tr>
密码:
${requestScope.sorry2}<
tdcolspan="
2"
submit"
value="
登录"
ahref="
${pageContext.request.contextPath}/servlet/RegisterServlet"
免费注册<
/a>
/table>
/form>
/body>
/html>
加上过滤器,放行LoginUI和已登录用户:
packagecn.xbai.filter;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importcn.xbai.domain.User;
publicclassAutoLoginFilterimplementsFilter{
publicvoiddestroy(){
//TODOAuto-generatedmethodstub
publicvoiddoFilter(ServletRequestreq,ServletResponseresp,
FilterChainchain)throwsIOException,ServletException{
//应该排除掉登录UI的Servlet:
//如果不排除,由于没登录,访问登录页时会始终重复跳转登录页,处于永远无法登录状态
HttpServletRequestrequest=(HttpServletRequest)req;
HttpServletResponseresponse=(HttpServletResponse)resp;
Stringuri=request.getRequestURI();
//从应用开始的部分地址
System.out.println(uri);
if(uri.contains("
LoginUIServlet"
System.out.println("
LoginUI"
chain.doFilter(request,response);
}else{//不存在的访问地址留待其他机制去处理!
特定部件只管特定事情!
Useruser=(User)request.getSession().getAttribute("
user"
if(user==null){
Notloggedin"
//检查带过来的Cookie,前提是上次登录设置了该Cookie
if(false){
}else{//没登录也没有上次登录时效信息
//jsp友好提示,并三秒重定向到登录UI
//response.sendRedirect(request.getContextPath()+"
/WEB-INF/jsp/redirect.jsp"
//已登录,放行
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
过滤器跳转jsp:
metahttp-equiv="
refresh"
content="
3;
url=${pageContext.request.contextPath}/servlet/LoginUIServlet"
/>
您还没有登录,亲!
(~_~)
效果:
进入登录页,直接点登录,会返回此页,因为跳转到的SubmitServlet同样处于未登录状态;
输入不存在的url,显示404?
?
发现问题:
登录提交的Servlet也不该经过该过滤器!
否则也永远无法登录!
修改补全:
(同时经过了两个Filter,自动登录的Filter中,登录UI和Submit页面均放行,登录成功后访问另一个Servlet测试自动登录Filter的拦截)
此时访问不存在的地址会跳转到UI页面(第二个Filter拦截了,待研究调试?
)
未做:
登录时设置登录信息Cookie回写给浏览器
web.xml:
?
xmlversion="
1.0"
encoding="
web-appversion="
2.5"
xmlns="
xmlns:
xsi="
http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
filter>
filter-name>
FilterDemo<
/filter-name>
filter-class>
cn.xbai.filter.FilterDemo<
/filter-class>
/filter>
filter-mapping>
url-pattern>
/*<
/url-pattern>
/filter-mapping>
AutoLoginFilter<
cn.xbai.filter.AutoLoginFilter<
servlet>
servlet-name>
FilterServlet<
/servlet-name>
servlet-class>
cn.xbai.servlet.FilterServlet<
/servlet-class>
/servlet>
LoginUIServlet<
cn.xbai.servlet.LoginUIServlet<
LoginSubmitServlet<
cn.xbai.servlet.LoginSubmitServlet<
servlet-mapping>
/servlet/FilterServlet<
/servlet-mapping>
/servlet/LoginUIServlet<
/servlet/LoginSubmitServlet<
welcome-file-list>
welcome-file>
index.jsp<
/welcome-file>
/welcome-file-list>
/web-app>
第一个Filter:
防乱码Filter
importcn.xbai.request.FilterRequest;
publicclassFilterDemoimplementsFilter{
//为了获取config参数,这里定义一个来接收:
privateFilterConfigconfig;
//默认字符集
privateStringdefaultCharset="
;
//这里接收:
this.config=filterConfig;
//注意它的参数不是Http...类型,第一步需要先转成这种类型!
!
Hi,Filter"
//获取要设置的字符集------->
不写死,写在filter配置中,这里获取
//设置缺省的,防止配置中未设置
Stringcharset=this.config.getInitParameter("
charset"
if(charset==null){
charset=defaultCharset;
//知道服务器传递过来的是Http...这里先转成...
request.setCharacterEncoding(charset);
//有时候只设置上面一行,因为mvc模式都是转给jsp输出,Servlet不用来输出,jsp页面已经设置了码表,所以不用在这里设置Servlet的response输出!
response.setCharacterEncoding(charset);
response.setContentType("
text/html;
charset="
+charset);
//关于get乱码问题:
将request包装,修改getParameter方法
//然后这里将包装后的request传递过去:
chain.doFilter(newFilterRequest(request),response);
Hi,FilterReturn"
用到的Request包装类:
packagecn.xbai.request;
importjava.io.UnsupportedEncodingException;
importjavax.servlet.ServletInputStream;
importjavax.servlet.http.HttpServletRequestWrapper;
//继承Java提供的包装类,不用再复写所有Request该有的方法,只需复写自己需要的
publicclassFilterRequestextendsHttpServletRequestWrapper{
//源码跟踪:
该类最顶级基类中定义了一个ServletRequest
//而不是HttpServletRequest,名为request,是被包装对象,
//可以传给它HttpServletRequest进行初始化,但要用到
//HttpServletRequest全部功能需要强转(多态)
/**
*并且该ServletRequest是基类私有,无法在子类调用,所以重新定义,并重写构造方法:
*/
privateHttpServletRequestrequest;
publicFilterRequest(HttpServletRequestrequest){
//经测:
父类也必须初始化,无论是否利用:
//除了下面构造函数的原因,经源码跟踪,最重要的:
父类根据传入的request获取到它后
//强转成HttpServletRequest,调用其每个方法实现包装类,如果不传,那么
//HttpServletRequest的方法根本就无法实现,那么就不是包装类
//注意这些实现的方法是HttpServletRequest的方法
//getParameter方法重写:
HttpServletRequest是接口类型,调用Web容器传递过来的
//实现类对象的该方法实现修改
*ImplicitsuperconstructorHttpServletRequestWrapper()
*isundefined.Mustexplicitlyinvokeanotherconstructor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动 登录 FilterSessionCookie 综合 例子
![提示](https://static.bdocx.com/images/bang_tan.gif)