【实战day02】完善登录功能及补充静态资源映射

1. 完善登录功能

前面我们已经完成了后台系统的员工登录功能开发,但还是存在一个问题,就是我们用户如果不登录直接访问系统首页,照常可以访问。

显然,这种情况是不合理的,我们希望看到的效果应该是,只有登录成功才可以访问系统的首页,如果每页登录则跳转到登录页面。

那么,如何实现这种功能呢?
答案就是拦截器或者过滤器,在拦截器或者过滤器中判断用户是否登录,每页登录则跳转到登录页面。

1.1 创建自定义过滤器LoginCheckFilter

我们新建一个包filter,在包里添加LoginCheckFilter过滤器。我们需要在类上添加@WebFilter注解标志该类为过滤器,并且需要声明过滤器名称以及拦截规模,/*即表明全部拦截。

@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
}

1.2 在启动类添加注解@ServletComponentScan

@Slf4j
@SpringBootApplication
//扫描拦截器的注解声明
@ServletComponentScan(basePackages = "com.hx.filter")
public class BingBingApplication {
    public static void main(String[] args) {
        SpringApplication.run(BingBingApplication.class,args);
        System.out.println("项目初始化完成");
        log.info("项目启动成功");
    }
}

1.3 完善过滤器的处理逻辑

过滤器的处理逻辑如下:
* 1. 获取本次请求的uri,并定义不需要拦截的路径请求
* 2. 判断是否是需要拦截的路径
* 3. 如果不需要处理,直接放行
* 4. 判断是否登录,登录就放行
* 5. 如果未登录就响应未登录,与前端进行信息交互。
在这里插入图片描述

/**
 * 过滤器,检查用户是否登录
 * 开启过滤器需要在启动类添加@ServletComponentScan进行过滤器扫描
 */
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {

    //路径匹配器,可以匹配一个通配符
    private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

    public boolean check(String[] uris,String requestURI){
        for (String uri : uris) {
            boolean flag = PATH_MATCHER.match(uri, requestURI);
            if(flag){
                return true;
            }
        }
        return false;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //1. 获取本次请求的uri,并定义不需要拦截的路径请求
        String requestURI = request.getRequestURI();
        String[] uris = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

        //2. 判断是否是需要拦截的路径
        boolean check = check(uris, requestURI);

        //3. 如果不需要处理,直接放行
        if(check){
            //对拦截到的请求进行放行操作
            filterChain.doFilter(request,response);
            return;
        }

        //4. 判断是否登录,登录就放行
        //从我们存入的session中获取数据,如果session中有数据,则表明登录成功,放行
        HttpSession session = request.getSession();
        Object employee = session.getAttribute("employee");
        if(employee!=null){
            filterChain.doFilter(request,response);
            return;
        }

        // 5. 如果未登录就响应未登录,与前端进行信息交互。
        //write传递字符串,需要将R对象转换成JSON字符串,传递的信息需要跟requset.js中的信息匹配。
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
    }

}

注意,第五步中跟前端进行交互返回的信息需要跟前端进行匹配。我们来看一下前端响应拦截器的方法。
在这里插入图片描述
第一个红框是根据服务端返回的数据进行判断,判断服务端返回的data中code是不是为0并且msg是不是为NOTLOGIN,判断通过的话就执行下面红框中页面跳转的操作。

设置拦截器之后,如果用户为进行登录就访问首页就会自动跳转到登陆页面。

这里我们访问一下首页,回车,因为没有登录,因此就会进行登录页面跳转
在这里插入图片描述
在这里插入图片描述

2. 静态资源映射

我们将前端开发人员提供的页面信息直接放到我们的resource目录下,启动我们的服务器是无法直接访问到的,因此,我们需要设置一个静态资源映射器,映射我们的静态资源页面
在这里插入图片描述

首先我们需要定义一个类来继承我们的WebMvcConfigurationSupport,并实现该类中的addResourceHandlers方法。然后重写该方法。将我们路径中包含/backend/**就帮我们映射到classpath:/backend/指定位置

记得添加@Configuration注解将其标志为我们的配置类。

@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    /**
     * 设置我们的静态资源映射
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //路径中包含/backend/**就帮我们映射到classpath:/backend/指定位置。
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
    	}
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 导入day02数据库: 首先需要在MySQL中创建一个名为day02的数据库,然后将day02.sql文件导入到该数据库中。可以使用以下命令: ``` mysql -u username -p day02 < day02.sql ``` 其中,`username`为MySQL的用户名,`day02`为数据库名,`day02.sql`为数据库文件路径。 2. 导入Java项目: 在Eclipse或IntelliJ IDEA等Java开发工具中,使用导入功能导入Java项目。具体步骤如下: 1)选择“File” -> “Import”菜单; 2)在弹出的“Import”对话框中,选择“Existing Projects into Workspace”; 3)选择项目所在的文件夹,并选中需要导入的Java项目; 4)点击“Finish”按钮完成导入。 3. 创建HTML页面: 可以使用任何文本编辑器创建HTML页面。以下是一个简单的注册页面的示例: ```html <!DOCTYPE html> <html> <head> <title>Register</title> </head> <body> <h1>Register</h1> <form action="register" method="post"> <label for="username">Username:</label> <input type="text" id="username" name="username"><br><br> <label for="password">Password:</label> <input type="password" id="password" name="password"><br><br> <input type="submit" value="Register"> </form> </body> </html> ``` 4. 编写测试代码自动化完成注册功能: 可以使用Selenium WebDriver进行自动化测试,以下是一个Java代码示例: ```java import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class RegisterTest { public static void main(String[] args) { // 设置Chrome驱动路径 System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); // 创建Chrome驱动 WebDriver driver = new ChromeDriver(); // 打开注册页面 driver.get("http://localhost/register.html"); // 输入用户名和密码 WebElement usernameInput = driver.findElement(By.id("username")); usernameInput.sendKeys("testuser"); WebElement passwordInput = driver.findElement(By.id("password")); passwordInput.sendKeys("testpassword"); // 提交表单 WebElement submitButton = driver.findElement(By.xpath("//input[@type='submit']")); submitButton.click(); // 等待页面跳转 driver.switchTo().alert().accept(); // 关闭浏览器 driver.quit(); } } ``` 其中,`/path/to/chromedriver`需要替换为Chrome驱动的实际路径。该代码会自动打开Chrome浏览器,输入用户名和密码,并提交表单完成注册。然后等待页面跳转并关闭浏览器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值