如何避免client端使用url直接訪問頁面並使用Spring的機制access所撰寫的jsp

Avoid direct access JSP with Spring Controller

公司所找的外包廠商, 在撰寫前段AP時,為了方便都會將頁面寫在 webcontent 下。

client端可以直接在url key入 http://ip:port/apllication_name/xxx.jsp直接訪問。

統整後的解法如下:

1. 將jsp頁面放在WEB-INF下,即可避免client端直接於url訪問。

2. 使用Spring MVC機制導向該頁

首先, 先建立一個類別 WebConfig 繼承 WebMvcConfigurerAdapter。

並於上方寫下@ComponentScan("你要掃描程式碼來源的package") →這會影響spring去找尋controller、interceptor...等實作類別的路徑,在此我們寫我們程式碼存在的同一層下的路徑com.spring.tku。

撰寫方法viewResolver,先告訴spring,當client端要求頁面時,要到哪個位置去找。

設定 ViewResolver 類別,setPrefix("/WEB-INF/子資料夾名稱"); setSuffix(".你的頁面副檔名");。

接著,有兩種方法。

第一種, 繼承抽象類別 WebMvcConfigurerAdapter,​覆寫 addViewControllers 方法。

並加入程式碼 registry.addViewController("/於url輸入的英文").setViewName("欲導向的頁面英文");。

第二種, 使用spring導向controller的方法,​做導向jsp的呼叫。

@RequestMapping("/sample") -> 代表於url輸入 http://localhost:8080/spring_ryuichi/sample。

return "sample" -> 代表會從 WEB-INF/view(前面有設定) 找出sample.jsp回傳。

@ComponentScan("com.spring.tku")
public class WebConfig extends WebMvcConfigurerAdapter {
	
    /**
    * This will set up the basic support we need for an MVC project
    * such as registering controllers and mappings, type converters, validation support
    * message converters and exception handling.
    */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        /**
        * we can register view controllers that create a direct mapping between the URL and the view name using the ViewControllerRegistry.
        * This way, there’s no need for any Controller between the two
        * 意即, 在此註冊路徑mapping, 於畫面上要取改jsp頁面時, 不需要額外寫controller去控制導向該頁
        */
        
        //eg. 設定此行, 要access WEB-INF/view下的index.jsp, 於畫面上打 http://localhost:8080/spring_ryuichi/
        //他就會自動導向該頁面 index.jsp
        registry.addViewController("/").setViewName("index");
        
        //eg. 要access WEB-INF/view下的testtuturu.jsp, 於畫面上打 http://localhost:8080/spring_ryuichi/tuturu
        //他就會自動導向該頁面 testtuturu.jsp
        registry.addViewController("/tuturu").setViewName("testtuturu");
    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        
        /**
        * we’ve registered a ViewResolver bean that will return .jsp views from the /WEB-INF/view directory
        */
        
        //輸入http://localhost:8080/spring_ryuichi/sample時, 會自動回傳WEB-INF/view下的sample.jsp
        bean.setPrefix("/WEB-INF/view/");
        bean.setSuffix(".jsp");
        
        return bean;
    }
    
	@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");//可直接在url上access的資源
        registry.addResourceHandler("/*").addResourceLocations("/");//增加此行使其可以讀webcontent下的靜態資源
        
        //registry.addResourceHandler("/view/**").addResourceLocations("/WEB-INF/view/");//增加此行使其可以讀WEB-INF/view下的東西
    }

}
@Controller
@ComponentScan("com.spring.tku")
public class TkuController {
	
    private static Logger logger = Logger.getLogger(TkuController.class);
	
    @RequestMapping("/sample")
    public String sample() {
		
		logger.info("進入Sample Controller");
        return "sample";
    }
}

3.結果