今天的簡(jiǎn)歷被查看了十份饮睬,還是一個(gè)hr都沒(méi)有給我打電話,有一個(gè)之前投的給我打電話纱新,但是因?yàn)槲椰F(xiàn)在在重慶沒(méi)有面成展氓。
吐槽完畢,分享今日學(xué)習(xí)心得
對(duì)于有些頁(yè)面脸爱,我們必須要求登陸成功以后才能訪問(wèn)遇汞,目前接觸到三種方式,先來(lái)介紹一下使用Filter實(shí)現(xiàn)登陸攔截驗(yàn)證
Filter是一個(gè)接口簿废,若要自定義一個(gè)過(guò)濾器空入,則必須實(shí)現(xiàn)Filter接口。為了完成登陸驗(yàn)證族檬,首先自定義一個(gè)登陸過(guò)濾器:LoginFilter.java
/**
* 登陸過(guò)濾器
*
* @author hetiantian
* @version 2017/12/26.
*/
public class LoginFilter implements Filter {
/**
* web應(yīng)用程序啟動(dòng)時(shí)調(diào)用此方法歪赢,用于初始化該Filter
*
* @param filterConfig 可以從參數(shù)中獲取初始化參數(shù)以及ServletContext信息等
* @throws ServletException
* */
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 攔截客戶端的請(qǐng)求
*
* @param servletRequest 客戶端的請(qǐng)求
* @param servletResponse 服務(wù)端的響應(yīng)
* @param filterChain 傳遞請(qǐng)求給下一個(gè)filter
* @throws ServletException
* @throws IOException
* */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)servletRequest;
HttpServletResponse rep = (HttpServletResponse)servletResponse;
//獲取session對(duì)象
HttpSession session = req.getSession();
//從session對(duì)象中獲取用戶信息
String name = (String)session.getAttribute("name");
System.out.println("name: " + name);
//如果沒(méi)有登陸,此時(shí)session將取不到值,重定向到登錄頁(yè)面
if (name == null || name.equals("")) {
rep.sendRedirect("/login.html");
} else {
//如果已經(jīng)登陸,繼續(xù)此次請(qǐng)求
//可以在這里做用戶名和密碼的驗(yàn)證
filterChain.doFilter(req, rep);
}
}
/**
* web程序關(guān)閉時(shí)調(diào)用此方法单料,用于銷毀一些資源
* */
@Override
public void destroy() {
}
}
在doFilter方法內(nèi)完成邏輯部分埋凯,通過(guò)session中的值來(lái)判斷是否登陸成功,session中的值需要我們自己去實(shí)現(xiàn)保存扫尖,因此定義了LoginAction類來(lái)完成將用戶信息保存在session中
LoginAction.java:
/**
* 登陸控制中心
*
* @author hetiantian
* @version 2017/12/26.
*/
public class LoginAction extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("請(qǐng)求分發(fā)正確");
String name = request.getParameter("name");
String password = request.getParameter("password");
//將用戶信息保存到session中
request.getSession().setAttribute("name", name);
request.getSession().setAttribute("password", password);
//重定向到success_login.html頁(yè)面中
response.sendRedirect("/success_login.html?request");
}
}
保存成功以后將跳轉(zhuǎn)至/success_login.html白对,因?yàn)槲覀優(yōu)檫@個(gè)頁(yè)面做了攔截(這個(gè)攔截由LoginFilter實(shí)現(xiàn))
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--分發(fā)登錄請(qǐng)求-->
<servlet>
<servlet-name>LoginAction</servlet-name>
<servlet-class>com.cqupt.javaweb.LoginAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginAction</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!--登陸過(guò)濾器-->
<filter>
<filter-name>login</filter-name>
<filter-class>com.cqupt.javaweb.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/success_login.html</url-pattern>
</filter-mapping>
</web-app>
在理一下邏輯:
登錄頁(yè)面login.html:里面有用戶和密碼兩個(gè)信息,表單提交給LoginAction换怖,在doPost方法里面保存用戶信息然后重定向到success_login.html頁(yè)面甩恼。只有登陸成功以后才能訪問(wèn)success_login.html,對(duì)success_login.html頁(yè)面通過(guò)LoginFilter做了攔截。
附:login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
用戶:<input type="text" name="name"><br/>
密碼:<input type="password" name="password"><br/>
<input type="submit" name="提交">
</form>
</body>
</html>
success_login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<center>
<h4>登陸成功</h4>
</center>
</body>
</html>
在驗(yàn)證結(jié)果打印值的時(shí)候条摸,出現(xiàn)了亂碼情況悦污,于是又定義了一個(gè)編碼過(guò)濾器,字符編碼Filter是最常用的Filter之一,在request提交給servlet之前對(duì)其指定編碼方式屈溉。spring中為我們集成了這個(gè)過(guò)濾器塞关,我們不需要自定義了,只要在web.xml中進(jìn)行過(guò)濾就可以了
編碼過(guò)濾器: EncodingFilter.java
/**
* 編碼過(guò)濾器,在request提交到servlet之前對(duì)request進(jìn)行指定的編碼方式
*
* @author hetiantian
* @version 2017/12/26.
*/
public class EncodingFilter implements Filter {
private String characterEncoding; //編碼方式,配置在web.xml中
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化編碼方式
characterEncoding = filterConfig.getInitParameter("characterEncoding");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//設(shè)置request子巾,response的編碼方式
if (characterEncoding != null) {
servletRequest.setCharacterEncoding(characterEncoding);
servletResponse.setCharacterEncoding(characterEncoding);
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
//銷毀時(shí)清空資源
characterEncoding = null;
}
}
注:這個(gè)解決亂碼的方式只針對(duì)post請(qǐng)求
項(xiàng)目地址:https://github.com/TiantianUpup/javaweb