記事のディレクトリ
管理システムやユーザーログインが必要なその他のシステムでは、ログイン検証は不可欠なリンクです。SpringBootによって開発されたプロジェクトでは、ユーザーログインの傍受と検証はインターセプターを実装することによって実現されます。
1.SpringBootによるログインインターセプトの実装の原則
SpringBootHandlerInterceptor
は、WebMvcConfigurer
インターフェースを実装することによってインターセプターを実装し、インターフェースを実装することによって構成クラスを実装し、インターセプターを構成クラスに挿入し、最後に@Configurationアノテーションを介して構成を挿入します。
1.1、HandlerInterceptor
インターフェースを実装する
実装HandlerInterceptor
3つの実装するインタフェースの必要性preHandle
:メソッドをpostHandle
、afterCompletion
。
3つの方法のそれぞれの機能は次のとおりです。
package blog.interceptor;
import blog.entity.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class UserLoginInterceptor implements HandlerInterceptor {
/***
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了拦截器的preHandle方法");
try {
HttpSession session = request.getSession();
//统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)
User user = (User) session.getAttribute("user");
if (user != null) {
return true;
}
response.sendRedirect(request.getContextPath() + "login");
} catch (Exception e) {
e.printStackTrace();
}
return false;
//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
//如果设置为true时,请求将会继续执行后面的操作
}
/***
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行了拦截器的postHandle方法");
}
/***
* 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("执行了拦截器的afterCompletion方法");
}
}
preHandle
これはコントローラーの前に実行されるため、インターセプターの機能は主にこの部分で実装されます。
- セッションに
user
オブジェクトがあるかどうかを確認します; - 存在する場合は、を返し
true
ます。その後、コントローラーは後続の操作を続行します。 - 存在しない場合は、ログインインターフェイスにリダイレクトされます。
コントローラーが実行される前に、このインターセプターを介してコントローラーが実行されpreHandle
ます。
1.2。WebMvcConfigurer
インターフェースを実装し、インターセプターを登録します
実装WebMvcConfigurer
構成クラスを実装し、このコンフィギュレーションクラスに上記実施インターセプターのオブジェクトを登録するためのインタフェースです。
package blog.config;
import blog.interceptor.UserLoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns( //添加不拦截路径
"/login", //登录路径
"/**/*.html", //html静态资源
"/**/*.js", //js静态资源
"/**/*.css" //css静态资源
);
}
}
インターセプターをインターセプターリストに登録し、ブロックするアクセスパス、ブロックしないアクセスパス、ブロックしないリソースファイルを指定します。最後に、構成に@Configurationアノテーションが挿入されます。
1.3、ログインし続ける
ログインは一度だけです。ログインしていれば、次回アクセス時に再度ログインする必要はなく、ウェブサイトのコンテンツに直接アクセスできます。
正しくログインすると、にuser
保存さsession
れます。ページに再度アクセスすると、ログインインターセプターはこのuser
オブジェクトを見つけることができるため、ログインインターフェイスを再度インターセプトする必要はありません。
@RequestMapping(value = {
"", "/", "/index"}, method = RequestMethod.GET)
public String index(Model model, HttpServletRequest request) {
User user = (User) request.getSession().getAttribute("user");
model.addAttribute("user", user);
return "users/index";
}
@RequestMapping(value = {
"/login"}, method = RequestMethod.GET)
public String loginIndex() {
return "users/login";
}
@RequestMapping(value = {
"/login"}, method = RequestMethod.POST)
public String login(@RequestParam(name = "username")String username, @RequestParam(name = "password")String password,
Model model, HttpServletRequest request) {
User user = userService.getPwdByUsername(username);
String pwd = user.getPassword();
String password1 = MD5Utils.md5Code(password).toUpperCase();
String password2 = MD5Utils.md5Code(password1).toUpperCase();
if (pwd.equals(password2)) {
model.addAttribute("user", user);
request.getSession().setAttribute("user", user);
return "redirect:/index";
} else {
return "users/failed";
}
}
2.コードの実装と例
コードの実装は上に示されています。
ログインに成功したら、user
情報session
を保存します。次にログインすると、ブラウザSESSIONID
は自分の情報session
に応じて対応する情報を見つけることができるので、再度ログインしないでください。Chromeブラウザから表示できます。
3.有効性の検証
3.1。localhost:8081 / indexページにアクセスします。
ログインインターセプトを実現したlocalhost:8081 / loginにリダイレクトされました。
3.2。ユーザー名とパスワードを正しく入力してログインします
3.3、localhost:8081 / indexに再度アクセスします
ログインインターセプターによって再度インターセプトされることはありません。これは、ログインを維持できることを証明します。