Filter二(利用Filter实现简单的登录验证)

Filter二(利用Filter实现简单的登录验证)

目标:1.我们规定利用Filter我们实现一个如果在Url中包含有admin的请求的时候,那么我们就要验证当前的用户是否登录,如果没有登录那么跳转到登录的界面

    2.当我们登录成功的时候,我们应该跳回到我们之前请求的页面。


1.首先创建我们的LoginFilter

 

public class LoginFilter implements Filter{
	
	private FilterConfig filterConfig ;


	public void destroy() {	
	}


	public void doFilter(ServletRequest serlvetRequest, ServletResponse serlvetResponse,
			FilterChain filterChain) throws IOException, ServletException {
 			HttpServletRequest httpServletRequest = (HttpServletRequest) serlvetRequest ;
 			HttpServletResponse httpServletResponse = (HttpServletResponse)serlvetResponse;
 			HttpSession session = httpServletRequest.getSession();
 			User loginUser	= (User)session.getAttribute(ConfigBean.session_login_user);
 			
 			if(loginUser == null){
 				String url = httpServletResponse.encodeRedirectURL(httpServletRequest.getRequestURL().toString()) ;
   				//throw new NotLoginException(url);
  				httpServletResponse.sendRedirect(ConfigBean.getBasePath()+"error/Login.jsp?returnUrl="+url);
  			}else{
 				filterChain.doFilter(serlvetRequest, serlvetResponse);
 			}
 	}


	public void init(FilterConfig filerConfig) throws ServletException {
 		this.filterConfig = filerConfig ;
	}
}

说明:1 .我们利用session去判断我们当前的用户是否是登录了,如果没有redirect登录的界面,同时我们要把我们当前访问的那个界面的url传入到登录的界面,这样在登录成功了,我们就可以返回到我们的请求的页面

    2.我们登录的界面是Login.jsp

2.配置我们的DD


	<filter>
		<filter-name>loginFilter</filter-name>
		<filter-class>com.filter.LoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>loginFilter</filter-name>
		<url-pattern>/admin/*</url-pattern>
	</filter-mapping>
	<servlet>
		<servlet-name>Login</servlet-name>
		<servlet-class>com.filter.Login</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Login</servlet-name>
		<url-pattern>/Login.do</url-pattern>
	</servlet-mapping>
在下面的这段DD中:
	<filter-mapping>
		<filter-name>loginFilter</filter-name>
		<url-pattern>/admin/*</url-pattern>
	</filter-mapping>
我们规定了,那些Url的请求我们是要进行过滤的,如果你是有多个,那么有多个filter-mapping 标签就行了。

说明:当我们如果访问http://localhost:8887/Servlet/admin/requestAction.do 那么就会调转到我们登录的界面如图:





可以看见我们的Url地址的后面添加了一个ReturnUrl的参数


3.编写我们Login.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="baseUrl" value="<%= ConfigBean.getBasePath() %>"></c:set>
  NotLoginException.jsp <br />
   <form action="${baseUrl }Login.do" method="post">
  <input type="hidden" name="returnUrl" value='${param.returnUrl }'/>
  	<table>
  		<tr>
  			<td>UserName : </td>
  			<td><input type="text" name="username" /></td>
  		</tr>
  		<tr>
  			<td>password : </td>
  			<td><input type="text" name="password" /></td>
  		</tr>
  		<tr>
  			<td colspan="2"> </td>
  			<td><input type="submit" value="登录" /></td>
  		</tr>
  	</table>
  </form>
  </body>


说明:1.ConfigBean只是我的一个全局的类,里面包含了一些系统常用的参数,比如说我这里的basePath

    2.我们把returnUrl 利用El表达式从param中取出来放到input 的隐藏域里面提交。


4.编写Login.do

 			
			String userName =	req.getParameter("username");
			String password = req.getParameter("password");
			String returnUrl = req.getParameter("returnUrl");
			System.out.println(returnUrl);
			User user = new User();
			user.setUserName(userName);
			user.setPassword(password);
			//login
			HttpSession session = req.getSession();
			session.setAttribute(ConfigBean.session_login_user, user);
			if(returnUrl != null && returnUrl.trim().length() > 0 ){
				resp.sendRedirect(returnUrl);
			}else{
				//返回 main.jsp 或者是Serlvet
 
			}
			
	


这样,我们第一个例子就写完了,第一次请求的时候没有登录所以会调转到登录的界面,如果我们登录成功了,那么会跳回我们最开始访问的那个界面。

当我们第二次请求(session 没用过期) 那么会直接访问到我们请求的Url地址 (请记住我们这里是拦截 url中含有/admin/的请求)


5.编写我们最开始请求的requestAction.do

@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
  			PrintWriter pw =	resp.getWriter() ;
  			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
 			pw.write("MH370");
 			pw.flush();
 			pw.close();
	}



思考:1.有的时候我们是用ajax提交的登录的数据的,你可以把登录成功过后,returnUrl的地址放回到 success(data) ,data 中,然后利用js 去发起一个新请求.

    2.我们现在看很多的网站的时候,有的登录界面是在页面上弹出一个 对话框去登录。(比如我们需要回复某一个帖子,那么可能需要你是登录的人才可以操作,要是想这样点击回复的时候,跳转到新的界面登录,然后再跳转回去,好像不太好。)

对于第二个问题,我们可以在点击“回复”的时候,在上面Filter的处理我们就不用重新定向到一个页面了,直接通过response返回一个write("<javascripte>openLogin()</javascripte>") ;  这样我们在页面引入对应的js 就可以弹开我们登录界面了。



现在有个问题? 如果是我请求的Url中带有查询参数,现在的测试结果是我们没有传递过去。






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值